package house

/*
详见：
https://blog.csdn.net/yuzhou_1shu/article/details/127504548

建造者模式:
又称生成器模式，是较为复杂的创建者模式，
它将客户端与包含多个组成部分的复杂 对象的创建过程分离， 客户端无需直到复杂对象的内部组成部分与装配方式，
只需要直到所需的建造者类型即可

定义: 将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示

建造者模式包含4个角色：
	1.builder 抽象建造者：为创建一个产品Product对象的各个部件指定抽象接口， 这个接口一般包括两类方法
		* buildPartX(): 创建复杂对象的各个部件
		* getResult(): 返回复杂对象
	2.ConcreteBuilder 具体建造者: 实现了Builder接口，实现各个部件的具体构造和装配方法,
			定义并明确其所创建的复杂对象，也可以提供一个方法返回创建好的复杂产品对象
	3.Product 产品角色: 它是最终被构建的复杂对象，包含多个组成部件，具体建造者创建该产品的内部表示并定义其装配过程
	4.Director 指挥者: 定义调用构造步骤的顺序。负责安排对象的建造次序，指挥者和抽象构建者之间存在关联关系，
		可以在其 construct()建造方法中调用建造者对象的部件构造与装配方法， 完成负责对象的建造。
*/

type IBuilder interface {
	setWindowType()  //设置窗户类型
	setDoorType()    //设置门类型
	setNumFloor()    //设置层数
	setSwimPool()    //设置泳池
	getHouse() House //获取房屋方法
}

// 根据要求, 返回对应的建造器 IBuilder
func getBuilder(builderType string) IBuilder {
	if builderType == "normal" { //普通房屋
		return newNormalBuilder()
	}

	if builderType == "cottages" { //别墅
		return newCottagesBuilder()
	}
	return nil
}
